<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
		<script type="text/javascript">
			//1.数组的解构赋值
			
			    //1.1 基本用法 
			        //ES6 允许按照一定模式，从数组和对象中提取值，对变量进行赋值，这被称为解构。
//						        let [a,b,c] = [1,2,3];
// 								console.log(a);//1
			        //本质上，这种写法属于“模式匹配”，只要等号两边的模式相同，左边的变量就会被赋予对应的值。
			        //如果解构不成功，变量的值就等于undefined。
//			                    let [foo] = [];
//			                    console.log(foo);//undefined
//			                    let [bar,foo] = [1];
//			                    console.log(foo);//undefined
			        //另一种情况是不完全解构，即等号左边的模式，只匹配一部分的等号右边的数组。这种情况下，解构依然可以成功。
//			                    let [a,b] = [1,2,3];
//			                    console.log(a);//1
                //1.2 默认值
                    //解构赋值允许指定默认值
//                        	let[foo=true] = [];
//							console.log(foo);//true
           
           //2.对象的解构赋值
           
               //解构还以用于对象
//                   let {foo,bar} = {foo:'foo',bar:'bar'};
//					 console.log(foo);//foo
//					 console.log(bar);//bar
               //对象的属性没有次序，变量必须与属性同名，才能取到正确的值
//                   let {bar,foo} = {foo:'foo',bar:'bar'};
//					 console.log(foo);//foo
//					 console.log(bar);//bar
               //变量名与属性名不一致，必须写成下面这样
//                   let { foo: baz } = { foo: 'aaa', bar: 'bbb' };
//                   console.log(baz);//aaa
               //对象的解构赋值是下面形式的简写
//             		 let {foo,bar} = {foo:'foo',bar:'bar'};
//                   let { foo: foo, bar: bar } = { foo: "aaa", bar: "bbb" };
               //对象的解构赋值的内部机制，是先找到同名属性，然后再赋给对应的变量。真正被赋值的是后者，而不是前者
//             		 let { foo: baz } = { foo: "aaa", bar: "bbb" };//foo是匹配的模式，baz才是变量
               //对象的解构也可以指定默认值，默认值生效的条件是，对象的属性值严格等于undefined。
               
           //3.字符串的解构赋值
//	               	const [a, b, c, d, e] = 'hello';
//	               	console.log(a);//h

           //4.数值和布尔值的解构赋值
                  //解构赋值时，如果等号右边是数值和布尔值，则会先转为对象。
//                      let {toString:s} = 123;
//						console.log(s===Number.prototype.toString);//true
                  //解构赋值的规则是，只要等号右边的值不是对象或数组，就先将其转为对象。
                  //由于undefined和null无法转为对象，所以对它们进行解构赋值，都会报错。
                  
            //5.函数参数的解构赋值
//               function add([x,y]){
//					return x + y;
//				 }
//				 console.log(add([1,2]));
            //6.圆括号问题
            //7.用途
                //7.1 交换变量的值
                //7.2 从函数返回多个值
                //7.3 函数参数的定义
                //7.4 提取JSON数据
                //7.5 函数参数的默认值
                //7.6 遍历Map结构
                //7.7 输入模块的指定方法
		</script>
	</body>
</html>
